package com.vonchenchen.photodemo;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
import android.os.StrictMode;

import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.vonchenchen.photodemo.utils.ImageLoaderManager;

import java.io.File;

/**
 * Created by vonchenchen on 2015/12/10 0010.
 */
public class MyApplication extends Application {

    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @SuppressWarnings("unused")
    @Override
    public void onCreate() {
        if (Constants.Config.DEVELOPER_MODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyDialog().build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyDeath().build());
        }

        super.onCreate();

        sContext = MyApplication.this;

        ImageLoaderManager.createDir(ImageLoaderManager.FILE_SAVENAME_UPLOAD);

        initImageLoader(getApplicationContext());
    }

    static Context sContext;

    public static Context getContext(){
        return sContext;
    }

    public static String ImagePath;

    @SuppressLint("NewApi")
    public static void initImageLoader(Context context) {

        ImagePath = context.getExternalCacheDir().getPath().toString() + "/image";

        // This configuration tuning is custom. You can tune every option, you may tune some of them,
        // or you can create default configuration by
        //  ImageLoaderConfiguration.createDefault(this);
        // method.
        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context);
        //设置下载线程的优先级
        config.threadPriority(Thread.NORM_PRIORITY - 2);
        //同一uri地址的图片，解压为两种尺寸的Bitmap，是否允许这两个Bitmap都被缓存
        config.denyCacheImageMultipleSizesInMemory();

        //硬盘存储文件名的命名方式
        //Md5FileNameGenerator
        //HashCodeFileNameGenerator
        //config.diskCacheFileNameGenerator(new Md5FileNameGenerator());

        //硬盘空间大小
        config.diskCacheSize(50 * 1024 * 1024); // 50 MiB
        //处理下载和显示线程的队列类型   先进先出 先进后出
        config.tasksProcessingOrder(QueueProcessingType.FIFO);
        //写错误日志
        config.writeDebugLogs(); // Remove for release app
        //***********************以下内容可以不进行设置***********************************
        //为所有用到ImageLoader的地方设置下载选项  如果我们需要在不同页面设置不同种类的图，
        //则在每个页面中单独进行设置
//		DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().
//				cacheInMemory(true).
//				cacheOnDisk(true).
//				bitmapConfig(Bitmap.Config.RGB_565).
//				imageScaleType(ImageScaleType.IN_SAMPLE_INT).
//				build();
//		config.defaultDisplayImageOptions(defaultOptions);

        //设置硬盘缓存路径和存储结构
        //UnlimitedDiskCache        无限制存储         默认存储 在DefaultConfigurationFactory设置
        //LimitedAgeDiskCache       有超时的存储方式
        //String catchPath = context.getExternalCacheDir().getPath().toString() + "/image";
        config.diskCache(new UnlimitedDiskCache(new File(ImageLoaderManager.FILE_IMAGELOADER_CACHE)));

        //设置内存缓存结构
        //FIFOLimitedMemoryCache
        //FuzzyKeyMemoryCache
        //LargestLimitedMemoryCache
        //LimitedAgeMemoryCache
        //LRULimitedMemoryCache
        //LruMemoryCache             默认缓存
        //UsingFreqLimitedMemoryCache
        //WeakMemoryCache
        config.memoryCache(new LruMemoryCache(1024 * 1024));

        //下载器
        //BaseImageDownloader  默认
        //可以使用OkHttp的底层
        //config.imageDownloader(new OkHttpImageDownloader(context, new OkHttpClient()));

        //设定缓存文件的数量
        //config.diskCacheFileCount(0);

        //可以设置线程及线程池相关

        //可以手动设置加载线程，也可以直接由DefaultConfigurationFractory创建默认
        //config.taskExecutor()                    下载线程
        //config.taskExecutorForCachedImages()     缓存线程
        //config.tasksProcessingOrder()            图片处理线程

        //设置解码器  解码器用于将图片解压成相应的大小
        //用到ImageDecodingInfo参数，用于设置解压的参数
        //BaseImageDecoder    默认
        //config.imageDecoder();

        // Initialize ImageLoader with configuration.
        ImageLoader.getInstance().init(config.build());
    }
}
